package inge_soft.gestoriusNuevo.persistence.DAO.implementation;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.DAO.abstraction.ILocalidadDAO;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Localidad;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Pais;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Provincia;

@Repository("localidadDAO")
public class LocalidadDAO implements ILocalidadDAO {

	@PersistenceContext
	private EntityManager entityManager;
	
	@Transactional(propagation = Propagation.MANDATORY)
	public void crear(Localidad localidad) throws GestoriusException {
		// TODO Auto-generated method stub
		
	}

	@Transactional(propagation = Propagation.MANDATORY)
	public void modificar(Localidad localidad) throws GestoriusException {
		// TODO Auto-generated method stub
		
	}

	@Transactional(propagation = Propagation.MANDATORY)
	public void eliminar(Localidad localidad) throws GestoriusException {
		// TODO Auto-generated method stub
		
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	public List<Localidad> obtenerTodasLasLocalidadesDePaisOrdenadasPorNombreAscendente(Pais pais) throws GestoriusException {
		Query q = entityManager.createQuery("SELECT DISTINCT l FROM Localidad l JOIN l.provincia prov JOIN prov.pais p WHERE p = :pais " +
				"ORDER BY l.codigoPostal");
		q.setParameter("pais", pais);
		return q.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true)
	public List<Localidad> obtenerTodasLasLocalidadesDePaisQueCoincidaConCodigoPostalOrdenadasPorNombreAscendente(
			Pais pais, String codigoPostal) {
		
		Query q = entityManager.createQuery("SELECT DISTINCT l FROM Localidad l JOIN l.provincia prov JOIN prov.pais p WHERE p = :pais " +
				"AND l.codigoPostal LIKE CONCAT (:codigoPostal,'%') ORDER BY l.codigoPostal");
		q.setParameter("pais", pais);
		q.setParameter("codigoPostal", codigoPostal);
		return q.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Localidad> obtenerLasLocalidadesDePaisQueCoincidanConNombreOrdenadasPorNombreAscendente(
			Pais pais, String nombre) {

		if (pais == null) { // si el pais que me pasan es null, devuelvo una lista vacia
			return new ArrayList<Localidad>();
		}
		
		Query q = entityManager.createQuery("SELECT DISTINCT l FROM Localidad l JOIN l.provincia prov JOIN prov.pais p " +
				"WHERE p = :pais AND l.nombre LIKE CONCAT (:nombre,'%')");
		q.setParameter("pais", pais);
		q.setParameter("nombre", nombre);
		return q.getResultList();
	}
	
	@Transactional(readOnly = true)
	public List<Localidad> obtenerLocalidades(Provincia provincia) throws GestoriusException {
		return (entityManager.createQuery("SELECT p FROM Localidad p WHERE p.provincia=:provincia").setParameter("provincia", provincia)).getResultList();
	}

}
